perm filename EVALL.LSP[206,LSP] blob
sn#381600 filedate 1978-09-19 generic text, type T, neo UTF8
;;;evall for functional LISP terms
(defun evall (e a)
(cond ((atom e)
(cond ((numberp e) e)
((eq e T) e)
((eq e NIL) e)
(T (cdr (assoc e a)))))
((atom (car e))
(cond ((eq (car e) 'QUOTE) (cadr e))
((eq (car e) 'COND) (evcond (cdr e) a))
((eq (car e) 'LIST) (evlist (cdr e) a))
((eq (car e) 'CAR) (car (evall (cadr e) a)))
((eq (car e) 'CDR) (cdr (evall (cadr e) a)))
((eq (car e) 'CAAR) (caar (evall (cadr e) a)))
((eq (car e) 'CADR) (cadr (evall (cadr e) a)))
((eq (car e) 'CADDR) (caddr (evall (cadr e) a)))
((eq (car e) 'CADAR) (cadar (evall (cadr e) a)))
((eq (car e) 'CADDAR) (caddar (evall (cadr e) a)))
((eq (car e) 'CONS) (cons (evall (cadr e) a) (evall (caddr e) a)))
((eq (car e) 'ATOM) (atom (evall (cadr e) a)))
((eq (car e) 'NULL) (null (evall (cadr e) a)))
((eq (car e) 'NUMBERP) (numberp (evall (cadr e) a)))
((eq (car e) 'EQ) (eq (evall (cadr e) a) (evall (caddr e) a)))
(T
;;;tracing evall evcond evlist
;;; (cond ((memq (car e) '(evall evcond evlist)) (print e)))
(evall (cons (cdr (assoc (car e) a)) (cdr e)) a))))
(T
(cond ((eq (caar e) 'LAMBDA)
(evall (caddar e) (prup (cadar e) (evlist (cdr e) a) a)))
((eq (caar e) 'LABEL)
(evall (cons (caddar e) (cdr e))
(cons (cons (cadar e) (caddar e)) a)))))))
(defun evcond (u a)
(cond ((null u) NIL)
((evall (caar u) a) (evall (cadar u) a))
(T (evcond (cdr u) a))))
(defun evlist (u a)
(cond ((null u) NIL)
(T (cons (evall (car u) a) (evlist (cdr u) a)))))
(defun prup (u v a)
(cond ((null u) a)
(T (prup (cdr u) (cdr v) (cons (cons (car u) (car v)) a)))))
(defun assoc (x u)
(cond ((null u) NIL)
((eq (caar u) x) (car u))
(T (assoc x (cdr u)))))
(defun ff (x)
(cond ((atom x) x) (T (ff (car x)))))
;;;evall alist initialization
(prog ()
(setq λevall
'(lambda (e a)
(cond ((atom e)
(cond ((numberp e) e)
((eq e T) e)
((eq e NIL) e)
(T (cdr (assoc e a)))))
((atom (car e))
(cond ((eq (car e) 'QUOTE) (cadr e))
((eq (car e) 'COND) (evcond (cdr e) a))
((eq (car e) 'LIST) (evlist (cdr e) a))
((eq (car e) 'CAR) (car (evall (cadr e) a)))
((eq (car e) 'CDR) (cdr (evall (cadr e) a)))
((eq (car e) 'CAAR) (caar (evall (cadr e) a)))
((eq (car e) 'CADR) (cadr (evall (cadr e) a)))
((eq (car e) 'CADDR) (caddr (evall (cadr e) a)))
((eq (car e) 'CADAR) (cadar (evall (cadr e) a)))
((eq (car e) 'CADDAR) (caddar (evall (cadr e) a)))
((eq (car e) 'CONS) (cons (evall (cadr e) a) (evall (caddr e) a)))
((eq (car e) 'ATOM) (atom (evall (cadr e) a)))
((eq (car e) 'NULL) (null (evall (cadr e) a)))
((eq (car e) 'NUMBERP) (numberp (evall (cadr e) a)))
((eq (car e) 'EQ) (eq (evall (cadr e) a) (evall (caddr e) a)))
(T (evall (cons (cdr (assoc (car e) a)) (cdr e)) a))))
(T
(cond ((eq (caar e) 'LAMBDA)
(evall (caddar e) (prup (cadar e) (evlist (cdr e) a) a)))
((eq (caar e) 'LABEL)
(evall (cons (caddar e) (cdr e))
(cons (cons (cadar e) (caddar e)) a)))))))
)
(setq λevcond
'(lambda (u a)
(cond ((null u) NIL)
((evall (caar u) a) (evall (cadar u) a))
(T (evcond (cdr u) a))))
)
(setq λevlist
'(lambda (u a)
(cond ((null u) NIL)
(T (cons (evall (car u) a) (evlist (cdr u) a)))))
)
(setq λprup
'(lambda (u v a)
(cond ((null u) a)
(T (prup (cdr u) (cdr v) (cons (cons (car u) (car v)) a)))))
)
(setq λassoc
'(lambda (x u)
(cond ((null u) NIL)
((eq (caar u) x) (car u))
(T (assoc x (cdr u)))))
)
(setq λff
'(lambda (x)
(cond ((atom x) x) (T (ff (car x)))))
)
(setq a (list (cons 'evall λevall)
(cons 'evcond λevcond)
(cons 'evlist λevlist)
(cons 'prup λprup)
(cons 'assoc λassoc)
))
(setq aa (list (cons 'ff λff)))
(return 'evall-alist-inited)
)
;;;← (evall '(evall '(ff 1) aa) (cons (cons 'aa aa) a))
;;;
;;;(EVALL (QUOTE (FF 1)) AA)
;;;(EVALL (CONS (CDR (ASSOC (CAR E) A)) (CDR E)) A)
;;;(EVALL (CADDAR E) (PRUP (CADAR E) (EVLIST (CDR E) A) A))
;;;(EVLIST (CDR E) A)
;;;(EVALL (CAR U) A)
;;;(EVLIST (CDR U) A)
;;;(EVCOND (CDR E) A)
;;;(EVALL (CAAR U) A)
;;;(EVALL (CADR E) A)
;;;(EVALL (CADAR U) A)
;;;1
;;;← (evall '(evall '(ff '(baz)) aa) (cons (cons 'aa aa) a))
;;;
;;;(EVALL (QUOTE (FF (QUOTE (BAZ)))) AA)
;;;(EVALL (CONS (CDR (ASSOC (CAR E) A)) (CDR E)) A)
;;;(EVALL (CADDAR E) (PRUP (CADAR E) (EVLIST (CDR E) A) A))
;;;(EVLIST (CDR E) A)
;;;(EVALL (CAR U) A)
;;;(EVLIST (CDR U) A)
;;;(EVCOND (CDR E) A)
;;;(EVALL (CAAR U) A)
;;;(EVALL (CADR E) A)
;;;(EVCOND (CDR U) A)
;;;(EVALL (CAAR U) A)
;;;(EVALL (CADAR U) A)
;;;(EVALL (CONS (CDR (ASSOC (CAR E) A)) (CDR E)) A)
;;;(EVALL (CADDAR E) (PRUP (CADAR E) (EVLIST (CDR E) A) A))
;;;(EVLIST (CDR E) A)
;;;(EVALL (CAR U) A)
;;;(EVALL (CADR E) A)
;;;(EVLIST (CDR U) A)
;;;(EVCOND (CDR E) A)
;;;(EVALL (CAAR U) A)
;;;(EVALL (CADR E) A)
;;;(EVALL (CADAR U) A)
;;;BAZ
;;;←
;;;← (evall '(evall '(ff '((bar.baz))) aa) (cons (cons 'aa aa) a))
;;;
;;;(EVALL (QUOTE (FF (QUOTE ((BAR . BAZ))))) AA)
;;;(EVALL (CONS (CDR (ASSOC (CAR E) A)) (CDR E)) A)
;;;(EVALL (CADDAR E) (PRUP (CADAR E) (EVLIST (CDR E) A) A))
;;;(EVLIST (CDR E) A)
;;;(EVALL (CAR U) A)
;;;(EVLIST (CDR U) A)
;;;(EVCOND (CDR E) A)
;;;(EVALL (CAAR U) A)
;;;(EVALL (CADR E) A)
;;;(EVCOND (CDR U) A)
;;;(EVALL (CAAR U) A)
;;;(EVALL (CADAR U) A)
;;;(EVALL (CONS (CDR (ASSOC (CAR E) A)) (CDR E)) A)
;;;(EVALL (CADDAR E) (PRUP (CADAR E) (EVLIST (CDR E) A) A))
;;;(EVLIST (CDR E) A)
;;;(EVALL (CAR U) A)
;;;(EVALL (CADR E) A)
;;;(EVLIST (CDR U) A)
;;;(EVCOND (CDR E) A)
;;;(EVALL (CAAR U) A)
;;;(EVALL (CADR E) A)
;;;(EVCOND (CDR U) A)
;;;(EVALL (CAAR U) A)
;;;(EVALL (CADAR U) A)
;;;(EVALL (CONS (CDR (ASSOC (CAR E) A)) (CDR E)) A)
;;;(EVALL (CADDAR E) (PRUP (CADAR E) (EVLIST (CDR E) A) A))
;;;(EVLIST (CDR E) A)
;;;(EVALL (CAR U) A)
;;;(EVALL (CADR E) A)
;;;(EVLIST (CDR U) A)
;;;(EVCOND (CDR E) A)
;;;(EVALL (CAAR U) A)
;;;(EVALL (CADR E) A)
;;;(EVALL (CADAR U) A)
;;;BAR
;;;←